#!/usr/bin/python3.5
# coding=utf-8

import numpy as np
import cv2

import matplotlib.pyplot as plt

####################
# SAD双目匹配算法
####################

# 从CSV读取灰度图imgL和imgR
print('loading image from CSV file')
imgL = np.genfromtxt('aL_gray.csv',delimiter=',').astype(np.float32)
imgR = np.genfromtxt('aR_gray.csv',delimiter=',').astype(np.float32) 
print("imgL.shape: ", imgL.shape)
HGT, WID = imgL.shape

# 显示读入的左右图像
plt.clf()
plt.subplot(1,2,1);plt.imshow(imgL,cmap='gray')
plt.subplot(1,2,2);plt.imshow(imgR,cmap='gray')
plt.show()

#####################################
## 在下面补充你的代码，对imgL中的每个像素，找到imgR中匹配的像素，
## 并将匹配像素的水平偏移量（取绝对值）保存在文件math.csv中
D = 40  # 像素匹配搜索最大偏移量
W = 7   # 像素匹配搜索时，窗口大小

# 构建一系列平移图像
img_shift= np.zeros((D, HGT, WID)) # 40张平移图片
for d in range(D):
    img_shift[d, :, :] = np.roll(imgR, d, axis=1)
    
# 计算左图和一系列平移后的右图的差，差值取绝对值
img_diff = np.abs(img_shift - imgL)

# 对图像差计算窗口平移
# 按图片张数，提取图片
for i in range(img_diff.shape[0]):
    img_diff[i, :, :] = cv2.boxFilter(img_diff[i, :, :], -1, (W, W))
    
# 逐个像素求最匹配的平移量
imgD = np.zeros((HGT, WID))
imgD = np.argmin(img_diff, axis = 0) # 获取 0 轴最小值索引
np.savetxt('match.csv', imgD, fmt='%d', delimiter=',', newline='\n')

# 显示结果
imgD=np.genfromtxt('match.csv', delimiter=',').astype(np.float32)
if False:
    plt.clf()
    plt.subplot(1,3,1);plt.imshow(cv2.cvtColor(imgL.astype(np.uint8),cv2.COLOR_BGR2RGB))
    plt.subplot(1,3,2);plt.imshow(cv2.cvtColor(imgR.astype(np.uint8),cv2.COLOR_BGR2RGB))
    plt.subplot(1,3,3);plt.imshow(imgD)
    plt.show() 
plt.imshow(imgD,cmap='jet')
plt.show()
#####################################

## 下面是保存CSV代码的例子
# data=np.random.randint(0,10,(427,370))  # 生成尺寸为427x370的随机整数矩阵
# np.savetxt('match.csv', data, fmt='%d', delimiter=',', newline='\n') # 保存为csv文件


